我认为这一定很容易,但我不明白。
假设我有以下 arparse 解析器:
import argparse parser = argparse.ArgumentParser( version='pyargparsetest 1.0' ) subparsers = parser.add_subparsers(help='commands') # all all_parser = subparsers.add_parser('all', help='process all apps') # app app_parser = subparsers.add_parser('app', help='process a single app') app_parser.add_argument('appname', action='store', help='name of app to process')
我如何识别使用了哪个子解析器?调用:
print parser.parse_args(["all"])
给我一个空的命名空间:
Namespace()
编辑: 请参阅quornian对这个问题的回答,这比我的要好,应该是公认的答案。
一个更简单的解决方案是添加dest到add_subparsers调用中。这在文档中被隐藏得更深一点:
dest
add_subparsers
[…] 如果需要检查被调用的子解析器的名称,add_subparsers() 调用的 dest 关键字参数将起作用
在您的示例中替换:
subparsers = parser.add_subparsers(help='commands')
和:
subparsers = parser.add_subparsers(help='commands', dest='command')
现在如果你运行:
你会得到
Namespace(command='all')
根据argparse 文档,结果parser.parse_args(...)将“仅包含主解析器和所选子解析器的属性”。不幸的是,这可能不足以确定使用了哪个子解析器。文档建议使用set_defaults(...)子解析器上的方法来解决这个问题。
parser.parse_args(...)
set_defaults(...)
例如,我在set_defaults()您的代码中添加了调用:
set_defaults()
import argparse parser = argparse.ArgumentParser( version='pyargparsetest 1.0' ) subparsers = parser.add_subparsers(help='commands') # all all_parser = subparsers.add_parser('all', help='process all apps') all_parser.set_defaults(which='all') # app app_parser = subparsers.add_parser('app', help='process a single app') app_parser.add_argument('appname', action='store', help='name of app to process') app_parser.set_defaults(which='app')
现在如果你跑
结果是
Namespace(which='all')
查看add_subparsers()文档以获取更多信息和另一个示例。
add_subparsers()